package singleton;

/**
 * 2022年3月12日 19:11:00 chanchaw
 * 双重检查懒汉式单例模式
 */
public class DoubleCheckSingleton {
    // 防止外部创建实例对象 - 保证只在本类内可以创建对象，保证单例
    private DoubleCheckSingleton() { }

    private volatile static DoubleCheckSingleton instance = null;

    // 双重检查是在使用 synchronized 的前后都进行检查是否为 null
    // 单次检查是在 synchronized 之前没有锁
    // 上锁之前不检查 null 在性能上会受影响 - 不管当前有没有实例都要被锁住
    public DoubleCheckSingleton getInstance(){
        if(instance == null){
            synchronized (DoubleCheckSingleton.class) {
                if( instance == null )
                    instance = new DoubleCheckSingleton();
            }
        }

        return instance;
    }
}
